package com.yuhuihui.common.utils;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.Properties;

/**
 * sftp工具类
 *
 * @author yuhh
 * @date 2023-05-25 14:42:04
 */
public final class SftpUtil {

    /** logger */
    private static final Logger logger = LoggerFactory.getLogger(SftpUtil.class);

    /**
     * 文件上传
     *
     * @param hostname    ip或域名地址
     * @param port        端口
     * @param username    用户名
     * @param password    密码
     * @param workingPath 服务器的工作目录
     * @param inputStream 要上传文件的输入流
     * @param fileName    设置上传之后的文件名
     * @return boolean 是否成功，true：成功；false：失败
     * @author yuhh
     * @date 2023-05-25 14:42:10
     */
    public static boolean upload(String hostname, int port, String username, String password, String workingPath, InputStream inputStream, String fileName){
        Session sshSession = initSession(hostname, port, username, password);
        ChannelSftp sftp = initChannel(sshSession);
        if (sftp == null){
            return false;
        }
        String filePath = workingPath + "/" + fileName;
        try {
            sftp.put(inputStream, filePath);
        } catch (SftpException e) {
            logger.error("上传文件出现异常", e);
            return false;
        } finally {
            close(sftp, sshSession);
        }
        return true;
    }

    /**
     * 初始化sftp的Session
     *
     * @param hostname ip或域名地址
     * @param port     端口
     * @param username 用户名
     * @param password 密码
     * @return {@link Session }
     * @author yuhh
     * @date 2023-05-25 14:42:15
     */
    private static Session initSession(String hostname, int port, String username, String password) {
        JSch jsch = new JSch();
        try {
            Session sshSession = jsch.getSession(username, hostname, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            return sshSession;
        } catch (Exception e){
            logger.error("初始化sftp的session出现异常", e);
            return null;
        }
    }

    /**
     * 初始化sftp的ChannelSftp
     *
     * @param sshSession sftp的session
     * @return {@link ChannelSftp }
     * @author yuhh
     * @date 2023-05-25 14:42:20
     */
    private static ChannelSftp initChannel(Session sshSession) {
        if (sshSession == null){
            return null;
        }
        try {
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            return (ChannelSftp) channel;
        } catch (Exception e){
            logger.error("初始化sftp的ChannelSftp出现异常", e);
            return null;
        }
    }

    /**
     * 关闭sftp
     *
     * @param sftp       sftp
     * @param sshSession ssh会话
     * @author yuhh
     * @date 2023-05-25 14:42:26
     */
    private static void close(ChannelSftp sftp, Session sshSession){
        if (sftp != null && sftp.isConnected()) {
            sftp.disconnect();
        }
        if (sshSession != null && sshSession.isConnected()) {
            sshSession.disconnect();
        }
    }
}
